package com.site.data;

import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

public interface IBaseDAO<T> {

	/**
	 * 创建jdbcsql 更新
	 * 
	 * @param sql
	 * @return
	 */
	public abstract Integer jdbcExecUpdate(String sql);

	/**
	 * 创建jdbc对象查询
	 * 
	 * @param sql
	 * @param cls
	 *            返回类型对象
	 * @return
	 */
	public abstract List<Object[]> jdbcExecQuery(String sql, Class cls);

	/*
	 * @description 批量保存
	 * 
	 * @params entity 泛型实体类
	 * 
	 * @params object 另外的参数
	 */
	public abstract void jdbcSaveEntityBatch(List<T> listEntity);

	/*
	 * @description 保存
	 * 
	 * @params entity 泛型实体类
	 * 
	 * @params object 另外的参数
	 */
	@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
	public abstract void execSave(T entity);

	/**
	 * @description 批量保存实例
	 * @param listEntity
	 */
	@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
	public abstract void execSaveBatch(List<T> listEntity);

	/**
	 * 查询jpql语言
	 * 
	 * @param jpql
	 * @param classname
	 * @return
	 */

	public abstract Object queryUpdate(String jpql);

	/*
	 * @description 更新
	 * 
	 * @params entity 泛型实体类
	 * 
	 * @params object 另外的参数
	 */
	public abstract void execUpdate(T entity);

	/*
	 * @description 根据ID查找
	 * 
	 * @params entityid 实体类Id
	 */
	@Transactional(readOnly = true, isolation = Isolation.READ_COMMITTED)
	public abstract T execFindById(Serializable entityid);

	/*
	 * @description count计数
	 * 
	 * @params whereJPQL 查询语句 如：name=1? and pwd=2?
	 * 
	 * @params params 查询参数值
	 */
	public abstract Long queryCount(String whereJPQL, Map params);

	/*
	 * @description 根据ID删除
	 * 
	 * @params ids 实体类Id
	 */
	public abstract void execDelete(Object[] ids);

	/*
	 * @description 根据条件删除
	 * 
	 * @params ids 实体类Id
	 */
	public abstract void queryDeleteBatch(String whereJPQL);

	/**
	 * 创建本有命名的jsql查询
	 * 
	 * @param sql
	 * @param classname
	 * @return
	 */
	public abstract int createNamedUpdate(String namedSql, Class<T> classname);

	/**
	 * 创建本有命名的jsql查询
	 * 
	 * @param sql
	 * @param classname
	 * @return
	 */
	public abstract List createNamedList(String namedSql, Class<T> classname);

	/**
	 * 创建本有命名的jsql查询
	 * 
	 * @param sql
	 * @param classname
	 * @return
	 */
	public abstract Object createNamedObject(String namedSql, Class<T> classname);

	/**
	 * 查询jpql语言
	 * 
	 * @param jpql
	 * @param classname
	 * @return
	 */
	public abstract List queryForList(String jpql, Class<T> classname);

	/**
	 * 查询jpql语言
	 * 
	 * @param jpql
	 * @param classname
	 * @return
	 */

	public abstract Object queryForObject(String jpql, Class<T> classname);

	/*
	 * @description 分页查询
	 * 
	 * @params startIndex 页码
	 * 
	 * @params maxResult 最大的返回记录数
	 * 
	 * @params whereJPQL 查询语句 如：name=1? and pwd=2?
	 * 
	 * @params params 查询参数值
	 * 
	 * @params orderby 排序条件 如 ：key=name value=desc .....
	 */
	public abstract QueryResult queryData(int startIndex, int maxResult, String whereJPQL, Map params,
			LinkedHashMap<String, String> orderby);

	/*
	 * @description 分页查询
	 * 
	 * @params startIndex 页码
	 * 
	 * @params maxResult 最大的返回记录数
	 */
	public abstract QueryResult queryData(int startIndex, int maxResult);

	/*
	 * @description 分页查询
	 * 
	 * @params startIndex 页码
	 * 
	 * @params maxResult 最大的返回记录数
	 * 
	 * @params whereJPQL 查询语句 如：name=1? and pwd=2?
	 * 
	 * @params params 查询参数值
	 */
	public abstract QueryResult queryData(int startIndex, int maxResult, String whereJPQL, Map params);

	/*
	 * @description 分页查询
	 * 
	 * @params startIndex 页码
	 * 
	 * @params maxResult 最大的返回记录数
	 * 
	 * @params orderby 排序条件 如 ：key=name value=desc .....
	 */
	public abstract QueryResult queryData(int startIndex, int maxResult, LinkedHashMap<String, String> orderby);

	/*
	 * @description 条件排序查询
	 * 
	 * @params startIndex 页码
	 * 
	 * @params maxResult 最大的返回记录数
	 * 
	 * @params whereJPQL 查询语句 如：name=1? and pwd=2?
	 * 
	 * @params params 查询参数值
	 * 
	 * @params orderby 排序条件 如 ：key=name value=desc .....
	 */
	public abstract QueryResult queryData(String whereJPQL, Map params, LinkedHashMap<String, String> orderby);

	/*
	 * @description 条件查询
	 * 
	 * @params whereJPQL 查询语句 如：name=1? and pwd=2?
	 * 
	 * @params params 查询参数值
	 */
	public abstract QueryResult queryData(String whereJPQL, Map params);

	/*
	 * @description order by查询
	 * 
	 * @params orderby 排序条件 如 ：key=name value=desc .....
	 */
	public abstract QueryResult queryData(LinkedHashMap<String, String> orderby);

}